

package com.api.common.xss;

import org.jsoup.Jsoup;
import org.jsoup.safety.Safelist;

/**
 * XSS过滤工具类
 */
public class XssUtils extends Safelist {

    /**
     * XSS过滤
     */
    public static String filter(String html){
        return Jsoup.clean(html, xssWhitelist());
    }

    /**
     * XSS过滤白名单
     */
    private static Safelist xssWhitelist(){
        return new Safelist()
            //支持的标签
            .addTags("a", "b", "blockquote", "br", "caption", "cite", "code", "col", "colgroup", "dd", "div", "dl",
                    "dt", "em", "h1", "h2", "h3", "h4", "h5", "h6", "i", "img", "li", "ol", "p", "pre", "q", "small",
                    "strike", "strong","sub", "sup", "table", "tbody", "td","tfoot", "th", "thead", "tr", "u","ul",
                    "embed","object","param","span")

            //支持的标签属性
            .addAttributes("a", "href", "class", "style", "target", "rel", "nofollow")
            .addAttributes("blockquote", "cite")
            .addAttributes("code", "class", "style")
            .addAttributes("col", "span", "width")
            .addAttributes("colgroup", "span", "width")
            .addAttributes("img", "align", "alt", "height", "src", "title", "width", "class", "style")
            .addAttributes("ol", "start", "type")
            .addAttributes("q", "cite")
            .addAttributes("table", "summary", "width", "class", "style")
            .addAttributes("tr", "abbr", "axis", "colspan", "rowspan", "width", "style")
            .addAttributes("td", "abbr", "axis", "colspan", "rowspan", "width", "style")
            .addAttributes("th", "abbr", "axis", "colspan", "rowspan", "scope","width", "style")
            .addAttributes("ul", "type", "style")
            .addAttributes("pre", "class", "style")
            .addAttributes("div", "class", "id", "style")
            .addAttributes("embed", "src", "wmode", "flashvars", "pluginspage", "allowFullScreen", "allowfullscreen",
                "quality", "width", "height", "align", "allowScriptAccess", "allowscriptaccess", "allownetworking", "type")
            .addAttributes("object", "type", "id", "name", "data", "width", "height", "style", "classid", "codebase")
            .addAttributes("param", "name", "value")
            .addAttributes("span", "class", "style")

            //标签属性对应的协议
            .addProtocols("a", "href", "ftp", "http", "https", "mailto")
            .addProtocols("img", "src", "http", "https")
            .addProtocols("blockquote", "cite", "http", "https")
            .addProtocols("cite", "cite", "http", "https")
            .addProtocols("q", "cite", "http", "https")
            .addProtocols("embed", "src", "http", "https");
    }

    public static void main(String[] args) {
        StringBuilder html = new StringBuilder();
        html.append("<div class='detail-content' data-v-1a1780aa=''><h1 class='title' data-v-1a1780aa=''>第一届直直公益“守护大自然的小美好”公益征集活动获选名单公示</h1> <div class='info' data-v-1a1780aa=''><p class='author' data-v-1a1780aa=''>\n" +
                "                        直直<em data-v-1a1780aa=''>·</em><span class='time' data-v-1a1780aa=''> 2023-12-29</span></p> <p class='tags' data-v-1a1780aa=''>干货文章</p> <p data-v-1a1780aa=''></p></div> <div class='content' data-v-1a1780aa=''><p>第一届直直公益“守护大自然的小美好”公益征集活动获选名单公示</p>\n" +
                "<p>&nbsp;</p>\n" +
                "<p>第一届直直公益“守护大自然的小美好”公益征集活动在12月28日晚20：00正式结束投票，最终获选的项目名单新鲜出炉！</p>\n" +
                "<p>&nbsp;</p>\n" +
                "<p>&nbsp;</p>\n" +
                "<p>本届直直公益“守护大自然的小美好”公益征集活动共征收到来自公益组织、大学生团队及社会爱心人士的60余个生态环保领域的公益议题，经过由中华环保联合会副秘书长李瑞东、</p>\n" +
                "<p>联合国教科文组织东亚多部门地区办事处高级顾问穆建新、梦南舍可持续发展服务中心理事长申顶芳，直直公益负责人若白等领域专家组成的评审团打分后，共有来自3个组别共8个项目入围了最终的评选。</p>\n" +
                "<p>&nbsp;</p>\n" +
                "<p>12月26日—12月28日，在BOSS直聘APP内，8组项目进行了最终的大众投票，投票情况公示如下：</p>\n" +
                "<p></p>\n" +
                "<p></p>\n" +
                "<p></p>\n" +
                "<p>恭喜以上获选的项目！</p>\n" +
                "<p>这是直直公益首届“守护大自然的小美好”公益征集活动，在活动的筹备、征集及评审的过程中，非常感谢各位业界同仁以及社会爱心人士给予的帮助和支持，也感谢BOSS直聘各位用户的热心投票。我们相信，每一个善行的开始，一定是源于一个小小的善念。就像大自然的改变，也总是先发生在细微处。。直直公益将会继续发现被忽略的生态环保小问题，并致力于真实地解决这些小问题。</p>\n" +
                "<p>&nbsp;</p>\n" +
                "<p>2024年，我们将会根据以上获选项目实际的调研结果，并结合专家的建议，得出具体的执行方案，精准执行。欢迎大家的监督，我们明年再见！直直公益，守护大自然的小美好！</p>\n" +
                "<p>&nbsp;</p>\n" +
                "<p>&nbsp;</p></div></div>");
        System.out.println(filter(html.toString()));
    }

}
